/**
 * Configuration.java    08/03/2012
 */

package l3.info.Projet.Utilitaires; 

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;

/**
 * Permet de gérer un fichier de configuration (création si non existence etc.)
 * @author Loïc Martinez
 * @version 1.0
 */

public class Configuration {

	private String nomFichier;
	private static final String userDirectory = 
			System.getProperty("user.dir") + "/";
	
	/**
	 * Créé le fichier s'il n'existe pas déjà
	 * @param nomFichier, le nom du fichier à créer
	 */
	public Configuration(String nomFichier, String[] attributs) {
		try {
			File f = new File(userDirectory + nomFichier);
			this.nomFichier = nomFichier;
			if (!f.exists()) {
				f.createNewFile();
				ecrireAttributs(f, attributs);
			}
		} catch (IOException e) {
			System.err.println("Problème de création de fichier !");
		}
	}
	
	/**
	 * Ecrit les attributs dans le fichier
	 * @param f, le fichier
	 * @param att, le tableau d'attributs
	 */
	public void ecrireAttributs(File f, String[] att) {
		try {
			FileWriter fw = new FileWriter(f);
			BufferedWriter output = new BufferedWriter(fw);
			for (int i = 0; i < att.length; i++) {
				output.write(att[i] + "=" + "\n");
			}
			output.flush();
			output.close();
		} catch (IOException e) {
			System.err.println("Problème ecrireAttributs");
		}
	}
	
	/**
	 * Modifie la valeur des attributs
	 * @param attribut, le nom de l'attribut
	 * @param valeur, la valeur à attribuer à attribut
	 */
	public void modifierValeur(String attribut, String valeur) {
		try {
			Properties p = new Properties();
			FileInputStream inStream = new FileInputStream(userDirectory 
					+ getNomFichier());
			p.load(inStream);
			changeValue(p, attribut, valeur);
			FileOutputStream fos = new FileOutputStream(userDirectory 
					+ getNomFichier());
			p.store(fos, null);
			inStream.close();
			fos.close();
		} catch (IOException e) {
			System.err.println("Erreur modifierValeur");
		}
	}
	
	/**
	 * Change la valeur d'un attribut d'un objet Properties
	 * @param p, l'objet Properties à modifier
	 * @param attribut, le nom de l'attribut
	 * @param valeur, la valeur à attribuer à attribut
	 * @return p, l'objet Properties modifié
	 */
	public Properties changeValue(Properties p, String attribut, 
			String valeur) {
		Iterator<Object> it = p.keySet().iterator();
		while (it.hasNext()) {
			String propertyName = it.next().toString();
			if (propertyName.equals(attribut)) {
				p.setProperty(attribut, valeur);
			} else {
				String propertyValue = p.getProperty(propertyName);
				p.setProperty(propertyName, propertyValue);
			}
		}
		return p;
	}
	
	/**
	 * Retourne la valeur d'un attribut
	 * @param attribut, l'attribut dont on veut la valeur
	 * @return la valeur de l'attribut
	 */
	public String valueOf(String attribut) {
		try {
			Properties p = new Properties();
			FileInputStream inStream;
			inStream = new FileInputStream(userDirectory + getNomFichier());
			try {
				p.load(inStream);
				return p.getProperty(attribut);
			} catch (IOException e) {
				System.err.println("Problème valueOf");
			}
		} catch (FileNotFoundException e) {
			System.err.println("Problème valueOf");
		}
		return null;
	}
	
	/**
	 * Getter nomFichier
	 * @return nomFichier, le nom du fichier
	 */
	public String getNomFichier() {
		return nomFichier;
	}
}
